﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Text.RegularExpressions;
using System.Windows.Controls;

namespace SHomeWorkshop.LunarSF.StudentInfosManager.ValidationRules
{
    /// <summary>
    /// 学籍号验证类。
    /// </summary>
    public class SchoolRollRule : LValidationRule
    {
        public override ValidationResult Validate(object value, System.Globalization.CultureInfo cultureInfo)
        {
            string text = Format(value.ToString());
            //考虑到要求班主任输入学籍号不现实，所以学籍号应当在最后集中处理
            if (string.IsNullOrWhiteSpace(text))
                return new ValidationResult(true, null); //验证OK

            if (/*string.IsNullOrWhiteSpace(text) || text.Length <= 1 || */text.Length > 50)
                return new ValidationResult(false, "“学籍号”的长度只能在【1，50】之间。"); //验证失败

            Regex regex = new Regex(@"[GJL]\d{17,17}[0-9X]");//已经转换为大写了
            var match = regex.Match(text);
            if (match.Success)
            {
                if (_IDCard.CheckCidInfo18(text.Substring(1)) == "")
                {
                    return new ValidationResult(true, null); //验证OK
                }
                else
                {
                    return new ValidationResult(false, "“学籍号”必须以“G”或“L”或“J”开头，并接符合身份证号规则的结尾。"); //验证失败
                }
            }
            else
                return new ValidationResult(false, "“学籍号”必须以“G”或“L”或“J”开头，并接符合身份证号规则的结尾。"); //验证失败

            //G、J开头，都是全国正式学籍号码。L开头的，是临时的。
            //
            //全国正式学籍号的编码规则是：
            //      G + 身份证号(对于有身份证号的学生)、
            //      J + 按身份证号编码规则生成的数字(6位学校所在地区划码 + 8位出生日期 + 3位顺序码 + 1位校验码)(对于没有身份证号的学生);
            //
            //全国临时学籍号的编码规则是:
            //      L + 按身份证号编码规则生成的数字(6位学校所在地区划码 + 8位出生日期 + 4位随机码)，都是19位。
            //
            //教育部已为进入中央系统的所有学生配发了全国正式学籍号或临时学籍号。
        }

        public static string Format(string origin)
        {
            if (string.IsNullOrWhiteSpace(origin)) return "";

            return FullCharsToHalf(origin).ToUpper();
        }
    }
}
